package model;
import java.util.ArrayList;
import java.util.List;
import java.util.Stack;

import excecao.ErroSemanticoException;



public class AnalisadorSemantico {
	 
	private ArrayList<Exception> errosSemanticos;
	private Stack<String> pilha;
	
	public AnalisadorSemantico(Stack<String> pilha){
		this.pilha = pilha;
		errosSemanticos = new ArrayList<Exception>();
	}
	
	
	public boolean verificaTipo(Stack<String> pct) {
		this.pilha = pct;
		String tipo1 = (String) pilha.pop();
		String tipo2 = (String) pilha.pop();
		if ((tipo1.equals("int") && tipo2.equals("int"))
				||(tipo1.equals("boolean") && tipo2.equals("boolean"))
				|| tipo1.equals("char") && tipo2.equals("char")){
			pilha.push(tipo1);
			return true;
		}	
		return false;

	}
	
	public boolean verificaTipoRelacional(Stack<String> pct) {
		this.pilha = pct;
		String tipo1 = (String) pilha.pop();
		String tipo2 = (String) pilha.pop();
		if (tipo1.equals("int") && tipo2.equals("int")){		
			pilha.push("boolean");
			return true;
		}	
		return false;

	}
	public Stack<String> getPilha(){
		return this.pilha;
	}
	public void setPilha(Stack<String> pilha){
		this.pilha = pilha;
	}
	public String calculaTipo(Simbolo s){
		
		if(s.getCodigo() == Simbolo.INT || s.getCodigo() == Simbolo.NUMERO){
			return "int";
		}else if(s.getCodigo() == Simbolo.STRING){
			return "string";
		}else if(s.getCodigo() == Simbolo.BOOLEAN){
			return "boolean";
		}else if(s.getCodigo() == Simbolo.CHAR){
			return "char";
		}
		return "";
	}
	public boolean verificaTipoAtrib(Stack<String> pct) {
		pilha = pct;
		if (pilha.size()<2){
			return false;
		}
		String tipo1 = (String) pilha.pop();
		String tipo2 = (String) pilha.pop();
		if (isTipoValido(tipo1, tipo2)){
			pilha.push(tipo1);
			return true;
		}	
		return false;
	}


	
	public void adicionarErroSemantico(String mensagem){
		errosSemanticos.add(new ErroSemanticoException(mensagem));
	}
	
	public List<Exception> getErrosSemanticos(){
		return errosSemanticos;
	}

	private boolean isTipoValido(String tipo1, String tipo2) {
		return (tipo1.equals("int") && tipo2.equals("int"))
			 || (tipo1.equals("string") && tipo2.equals("string")) 
			 || (tipo1.equals("boolean") && tipo2.equals("boolean"));
	}
	

}
